{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "66b50abf",
   "metadata": {},
   "source": [
    "## 离散时间傅里叶变换DTFT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a0f1197",
   "metadata": {},
   "source": [
    "求矩形序列$x(n)=R_N(n)$的N点DTFT，并画出其幅度谱函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "232e9326",
   "metadata": {},
   "outputs": [],
   "source": [
    "#libraries\n",
    "import numpy as np;from math import *\n",
    "import matplotlib.pyplot as plt;from matplotlib import ticker\n",
    "from matplotlib.ticker import MaxNLocator"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "872112b5",
   "metadata": {},
   "source": [
    "生成一个矩形序列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "00ee6e93",
   "metadata": {},
   "outputs": [],
   "source": [
    "#define a sequence of rectangles，N=5\n",
    "N = 5;N0 = 51#length of sequence\n",
    "rn = np.ones(N);N1 = int((N0-N)/2)\n",
    "xn = np.append(np.zeros(N1),rn)\n",
    "xn = np.append(xn,np.zeros(N1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "093bcbd1",
   "metadata": {},
   "source": [
    "计算频谱的模拟角频率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b4b9fe29",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Calculate the simulated angular frequency\n",
    "n = np.arange(N0)-N1\n",
    "w = (np.arange(501)-int(501/2))*4*pi/500"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a5ab413",
   "metadata": {},
   "source": [
    "定义DTFT函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "b11dc172",
   "metadata": {},
   "outputs": [],
   "source": [
    "def DTFT(w, xn):\n",
    "    w = w.reshape(-1,1)\n",
    "    Xe = np.dot(np.exp(-1j*n*w),xn) \n",
    "    return Xe\n",
    "xe = DTFT(w, xn)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc843ff6",
   "metadata": {},
   "source": [
    "绘制矩形序列及其幅度谱函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "40f2c296",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Plot a sequence of rectangles and their magnitude spectral functions\n",
    "fig,axs = plt.subplots(2,1,constrained_layout=True)\n",
    "axs[0].stem(n,xn,basefmt=\"\");axs[1].plot(w/pi,np.abs(xe))\n",
    "axs[0].set_title('矩形序列的x(n)');axs[0].set_xlabel('n')\n",
    "axs[1].set_title('矩形序列的幅度谱函数');axs[1].grid()\n",
    "axs[1].set_xlabel(r'$ \\omega / \\pi $')\n",
    "axs[1].set_ylabel(r'$ |X( e^{j \\omega} )| $')\n",
    "axs[0].set_ylim([0,1.5]);axs[1].set_ylim([0,5])\n",
    "axs[1].xaxis.set_major_locator(MaxNLocator(11))\n",
    "axs[1].yaxis.set_major_locator(MaxNLocator(5))\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] \n",
    "plt.rcParams['axes.unicode_minus'] = False \n",
    "plt.show();fig.savefig('./dtft.png',dpi=500)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
